package main

type point struct {
	x, y int
}

func convert2point(p []int) point {
	return point{
		x: p[0],
		y: p[1],
	}
}

// 判断平行四边形==>判断矩形==>判断正方形
func checkLength(v1, v2 []int) bool {
	return v1[0]*v1[0]+v1[1]*v1[1] == v2[0]*v2[0]+v2[1]*v2[1]
}

func checkMidPoint(p1, p2, p3, p4 []int) bool {
	return p1[0]+p2[0] == p3[0]+p4[0] && p1[1]+p2[1] == p3[1]+p4[1]
}

func calCos(v1, v2 []int) int {
	return v1[0]*v2[0] + v1[1]*v2[1]
}

func help(p1, p2, p3, p4 []int) bool {
	v1 := []int{p1[0] - p2[0], p1[1] - p2[1]}
	v2 := []int{p3[0] - p4[0], p3[1] - p4[1]}
	return checkMidPoint(p1, p2, p3, p4) && checkLength(v1, v2) && calCos(v1, v2) == 0
}

func validSquare(p1, p2, p3, p4 []int) bool {
	if p1[0] == p2[0] && p1[1] == p2[1] {
		return false
	}
	if help(p1, p2, p3, p4) {
		return true
	}
	if p1[0] == p3[0] && p1[1] == p3[1] {
		return false
	}
	if help(p1, p3, p2, p4) {
		return true
	}
	if p1[0] == p4[0] && p1[1] == p4[1] {
		return false
	}
	if help(p1, p4, p2, p3) {
		return true
	}
	return false
}

// 该图形是正方形，那么任意三点组成的一定是等腰直角三角形，用此条件作为判断。
func isIsoscelesRightTriangle(p1, p2, p3 []int) bool {
	// 1. 边长判断 
	// 两点之间的距离  |x|^2+|y|^2
	d1 := (p1[0]-p2[0])*(p1[0]-p2[0]) + (p1[1]-p2[1])*(p1[1]-p2[1])
	d2 := (p1[0]-p3[0])*(p1[0]-p3[0]) + (p1[1]-p3[1])*(p1[1]-p3[1])
	d3 := (p3[0]-p2[0])*(p3[0]-p2[0]) + (p3[1]-p2[1])*(p3[1]-p2[1])
	return d1 > d2 && d2 == d3 && d1 == d2+d3 ||
		d2 > d3 && d1 == d3 && d2 == d1+d3 ||
		d3 > d1 && d2 == d1 && d3 == d2+d1

}

func validSquare1(p1, p2, p3, p4 []int) bool {
	// 判断是否是等腰直角三角形
	return isIsoscelesRightTriangle(p1, p2, p3) && isIsoscelesRightTriangle(p1, p2, p4) && isIsoscelesRightTriangle(p2, p3, p4) && isIsoscelesRightTriangle(p1, p3, p4)
}

func main() {

}
